package controller;

import java.io.IOException;
import java.sql.SQLException;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


import model.Benutzer;
import model.BenutzerRepository;
import model.EbenenRepository;
import model.FelderRepository;
import model.GruppenRepository;
import model.StichtagRepository;

/**
 * Eine abstrakte Klasse zur Kontrolle des aktuell eingeloggten Benutzers. Alle
 * Controller erben von dieser Klasse, dadurch erhalten sie Servleteigenschaften
 * und alle Accountfunktionen.
 */

@SuppressWarnings("serial")
public abstract class SessionControll extends HttpServlet {

	protected BenutzerRepository benutzerRepository;
	protected GruppenRepository gruppenRepository;
	protected EbenenRepository ebenenRepository;
	protected FelderRepository felderRepository;
	protected StichtagRepository stichtagRepository;

	
	
	
	/**
	 * Instanziiert Variablen und läd wenn nötig Objekte aus der Datenbank
	 */
	public SessionControll() {

		super();
		try {
			benutzerRepository = BenutzerRepository.getInstance();
			gruppenRepository = GruppenRepository.getInstance();
			ebenenRepository = EbenenRepository.getInstance();
			felderRepository = FelderRepository.getInstance();
			stichtagRepository = StichtagRepository.getInstance();

		} catch (ClassNotFoundException e) {
			try {
				new helper.Logging("Fehler F990",e.toString(), null, (byte)1);
			} catch (IOException e1) {
				e1.printStackTrace();
			}
			System.err.println("Es gab einen schwerwiegenden Systemfehler! Bitte versuchen Sie es erneut oder kontaktieren Sie einen Administrator. (F990)");
		} catch (SQLException e) {
			try {
				new helper.Logging("Fehler F991", e.toString(), null, (byte)1);
			} catch (IOException e1) {
				e1.printStackTrace();
			}
			System.err.println("Es gab einen schwerwiegenden Systemfehler! Bitte versuchen Sie es erneut oder kontaktieren Sie einen Administrator. (F991)");
		}
		//CronJob cronjob = new CronJob();
		
		// TODO Benutzerdaten checken
	}

	/**
	 * Loggt den aktuellen Benutzer aus dem System aus.
	 * 
	 * @param request
	 *            der request-Parameter
	 * @param response
	 *            der response-Parameter
	 */
	public void logout(HttpServletRequest request, HttpServletResponse response) {
		HttpSession session = request.getSession();
		session.setAttribute("email", null);
		session.setAttribute("verantwortlicher", null);
		session.setAttribute("redakteur", null);
		session.setAttribute("admin", null);
		session.setAttribute("dezernat2", null);
		session.setAttribute("user", null);
	}

	/**
	 * Prüfen der Login-Daten.
	 * 
	 * @param request
	 *            der request-Parameter
	 * @param response
	 *            der response-Parameter
	 * @return wenn die Login-Daten korrekt sind <code>true</code>, ansonsten
	 *         <code>false</code>
	 * @throws IOException
	 */
	public boolean loginPruefen(HttpServletRequest request,
			HttpServletResponse response) throws IOException {
		HttpSession session = request.getSession();

		if (session.getAttribute("email") == null
				|| session.getAttribute("email").equals("")) {
			response.sendRedirect("Fehler?weiterleitung=Index.html&fehler=Sie sind nicht eingeloggt! Bitte loggen Sie sich ein.");
			return false;
		}
		return true;
	}

	/**
	 * Prüfen auf die Gruppenberechtigung. Bei negativem Ergebnis: Redirect zu
	 * Fehlerseite.
	 * 
	 * @param request
	 *            der request-Parameter
	 * @param response
	 *            der response-Parameter
	 * @param berechtigung
	 *            die Berechtigung des Benutzers
	 * @return falls eine Berechtigung für die Seite besteht <code>true</code>,
	 *         anderenfalls <code>false</code>
	 * @throws IOException
	 */
	public boolean gruppePruefen(HttpServletRequest request,
			HttpServletResponse response, int berechtigung) throws IOException {
		HttpSession session = request.getSession();
		if (session.getAttribute("email") == null
				|| session.getAttribute("email").equals("")) {
			response.sendRedirect("Fehler?weiterleitung=Index.html&fehler=Sie sind nicht eingeloggt! Bitte loggen Sie sich ein.");
			return false;
		}
		switch (berechtigung) {
		case 1:
			if (!"true".equals(session.getAttribute("verantwortlicher"))) {
				response.sendRedirect("Fehler?weiterleitung=Index.html&fehler=Für diese Seite benötigen Sie die Berechtigung: \"Ebenenverantwortlicher\"!");
				return false;
			}
			break;
		case 2:
			if (!"true".equals(session.getAttribute("redakteur"))) {
				response.sendRedirect("Fehler?weiterleitung=Index.html&fehler=Für diese Seite benötigen Sie die Berechtigung: \"Redakteur\"!");
				return false;
			}
			break;
		case 3:
			if (!"true".equals(session.getAttribute("admin"))) {
				response.sendRedirect("Fehler?weiterleitung=Index.html&fehler=Für diese Seite benötigen Sie die Berechtigung: \"Administrator\"!");
				return false;
			}
			break;
		case 4:
			if (!"true".equals(session.getAttribute("dezernat2"))) {
				response.sendRedirect("Fehler?weiterleitung=Index.html&fehler=Für diese Seite benötigen Sie die Berechtigung: \"Dezernat 2\"!");
				return false;
			}
			break;
		}

		return true;
	}

	/**
	 * Prüft die Anmeldedaten und gibt bei Korrektheit den jeweiligen benutzer zurück.
	 * @param request
	 *            der request-Parameter
	 * @param response
	 *            der response-Parameter
	 * @return der Benutzer bei korrekten Anmeldedaten, ansonsten
	 *         <code>null</code>
	 * @throws IOException
	 */
	public Benutzer getAktuellerBenutzer(HttpServletRequest request,
			HttpServletResponse response) throws IOException {
		if (loginPruefen(request, response)) {
			HttpSession session = request.getSession();
			return benutzerRepository.getBenutzerNachEmail((String) session
					.getAttribute("email"));
		}
		return null;
	}

}
